/*
 * jedyne metody publiczne:
 * 
 * parsePlayer - po połączeniu się klienta z serwerem, serwer wysyła wynik tej metody
 *               są one potrzebne do wypełnienia klasy playerStats na kliencie,
 *               wystarczy wywołać raz, ale lepiej zrobić to po każdej walce/zmianie itema/czaru itp
 *             - jako wejście po prostu wrzucamy obiekt playera, wychodzi string
 *             - wywołanie Parser.parsePlayer(player)
 * 
 * parseFightData - po rozpoczęciu się walki generujemy za pomocą tej metody dla każdego playera
 *                  dane potrzebne do ocenienia po stronie klienta co się w walce będzie działo,
 *                  wywołujemy tylko po rozpoczęciu walki
 *                - dla każdego playera trzeba wywołąć osobno
 *                - wywołanie: Parser.parseFightData(playerlist,monsterlist,playerid)
 *                : palyerlist - lista playerów uczestniczących w walce
 *                : monsterlist - lista potworów uczestniczących w walce
 *                : playerid - id gracza dla którego parsujemy dane, jest to jego prawdziwe
 *                             id na liście (czyli 0-5)
 * 
 * parseEnemiesHp - obejście na problem, który pojawi się przy użyciu magii na wszystkich przeciwnikach,
 *                  jeżeli mamy w walce przeciwników z różnym lvl/defence, to serwer wyśle tylko ile obrażeń powinien czar
 *                  zadać (ze statystyk czaru), jest już zaimplementowane, nic z tym nie trzeba robić,
 *                  metoda na wejście bierze listę potworów i generuje stringa z ilością hp potworów,
 *                  po użyciu czaru
 */
package wowmobile;

import java.util.List;

public class Parser {

    Parser() {
    }

    public static String parsePlayer(Player player) {
        String message = "";
        message += "PlayerName," + player.getStats().getNick();
        message += ";PlayerClass," + player.getStats().getPclass().getClassname();
        message += ";PlayerHp," + player.getStats().getMaxhp();
        message += ";PlayerMana," + player.getStats().getMaxmana();
        message += ";PlayerImage," + player.getStats().getImage();

        message += ";Magics,";
        for (int i = 0; i < player.getStats().magiclist.size(); i++) {
            message += player.getStats().magiclist.get(i).getName();
            if (i != player.getStats().magiclist.size() - 1) {
                message += ",";
            }
        }
        message += ";MagicsDescriptions,";
        for (int i = 0; i < player.getStats().magiclist.size(); i++) {
            message += interpreter(-player.getStats().magiclist.get(i).getManacost(),
                    -player.getStats().magiclist.get(i).getHp(),
                    -player.getStats().magiclist.get(i).getMana(),
                    player.getStats().magiclist.get(i).getDefence(),
                    player.getStats().magiclist.get(i).getAttack(),
                    player.getStats().magiclist.get(i).getSpeed());
            if (i != player.getStats().magiclist.size() - 1) {
                message += ",";
            }
        }
        message += ";MagicsImage,";
        for (int i = 0; i < player.getStats().magiclist.size(); i++) {
            message += player.getStats().magiclist.get(i).getImage();
            if (i != player.getStats().magiclist.size() - 1) {
                message += ",";
            }
        }

        message += ";HandItems,";
        for (int i = 0; i < player.getStats().handitems.size(); i++) {
            message += player.getStats().handitems.get(i).getName();
            if (i != player.getStats().handitems.size() - 1) {
                message += ",";
            }
        }
        message += ";HandItemsDescriptions,";

        for (int i = 0; i < player.getStats().handitems.size(); i++) {
            switch (i) {
                case 0: {
                    message += "broń" + " ";
                    break;
                }
                case 1: {
                    message += "zbroja" + " ";
                    break;
                }
                case 2: {
                    message += "hełm" + " ";
                    break;
                }
                case 3: {
                    message += "rękawice" + " ";
                    break;
                }
                case 4: {
                    message += "buty" + " ";
                    break;
                }
                default: {
                    message += "placeholder" + " ";
                    break;
                }
            }
            message += interpreter(0, -player.getStats().handitems.get(i).getHp(),
                    -player.getStats().handitems.get(i).getMana(),
                    player.getStats().handitems.get(i).getDefence(),
                    player.getStats().handitems.get(i).getAttack(),
                    player.getStats().handitems.get(i).getSpeed());
            if (i != player.getStats().handitems.size() - 1) {
                message += ",";
            }
        }

        message += ";WearItems,";
        for (int i = 0; i < player.getStats().wearitems.size(); i++) {
            message += player.getStats().wearitems.get(i).getName();
            if (i != player.getStats().wearitems.size() - 1) {
                message += ",";
            }
        }
        message += ";WearItemsDescriptions,";
        for (int i = 0; i < player.getStats().wearitems.size(); i++) {
            message += interpreter(0, -player.getStats().wearitems.get(i).getHp(),
                    -player.getStats().wearitems.get(i).getMana(),
                    player.getStats().wearitems.get(i).getDefence(),
                    player.getStats().wearitems.get(i).getAttack(),
                    player.getStats().wearitems.get(i).getSpeed());
            if (i != player.getStats().wearitems.size() - 1) {
                message += ",";
            }
        }
        message += ";WearItemsImage,";
        for (int i = 0; i < player.getStats().wearitems.size(); i++) {
            message += player.getStats().wearitems.get(i).getImage();
            if (i != player.getStats().wearitems.size() - 1) {
                message += ",";
            }
        }

        message += ";PlayerDefence," + player.getStats().getDefence();
        message += ";PlayerAttack," + player.getStats().getAttack();
        message += ";PlayerSpeed," + player.getStats().getSpeed();
        message += ";PlayerLevel," + player.getStats().getLevel();
        return message;
    }

    public static String parseFightData(List<Player> players, List<Monster> enemies, int playerid) {
        String message = "";
        message += "PlayersNames,";
        for (int i = 0; i < players.size(); i++) {
            message += players.get(i).getStats().getNick();
            if (i != players.size() - 1) {
                message += ",";
            }
        }
        message += ";PlayersHp,";
        for (int i = 0; i < players.size(); i++) {
            message += players.get(i).getStats().getHp();
            if (i != players.size() - 1) {
                message += ",";
            }
        }
        message += ";PlayersMaxHp,";
        for (int i = 0; i < players.size(); i++) {
            message += players.get(i).getStats().getMaxhp();
            if (i != players.size() - 1) {
                message += ",";
            }
        }
        message += ";PlayersMana,";
        for (int i = 0; i < players.size(); i++) {
            message += players.get(i).getStats().getMana();
            if (i != players.size() - 1) {
                message += ",";
            }
        }
        message += ";PlayersMaxMana,";
        for (int i = 0; i < players.size(); i++) {
            message += players.get(i).getStats().getMaxmana();
            if (i != players.size() - 1) {
                message += ",";
            }
        }
        message += ";PlayersImages,";
        for (int i = 0; i < players.size(); i++) {
            message += players.get(i).getStats().getImage();
            if (i != enemies.size() - 1) {
                message += ",";
            }
        }
        message += ";Magics,";
        for (int i = 0; i < players.get(playerid).getStats().magiclist.size(); i++) {
            message += players.get(playerid).getStats().magiclist.get(i).getName();
            if (i != players.get(playerid).getStats().magiclist.size() - 1) {
                message += ",";
            }
        }
        message += ";MagicsDescriptions,";
        for (int i = 0; i < players.get(playerid).getStats().magiclist.size(); i++) {
            message += interpreter(players.get(playerid).getStats().magiclist.get(i).getManacost(),
                    players.get(playerid).getStats().magiclist.get(i).getHp(),
                    players.get(playerid).getStats().magiclist.get(i).getMana(),
                    players.get(playerid).getStats().magiclist.get(i).getDefence(),
                    players.get(playerid).getStats().magiclist.get(i).getAttack(),
                    players.get(playerid).getStats().magiclist.get(i).getSpeed());
            if (i != players.get(playerid).getStats().magiclist.size() - 1) {
                message += ",";
            }
        }
        message += ";MagicsImage,";
        for (int i = 0; i < players.get(playerid).getStats().magiclist.size(); i++) {
            message += players.get(playerid).getStats().magiclist.get(i).getImage();
            if (i != players.get(playerid).getStats().magiclist.size() - 1) {
                message += ",";
            }
        }
        message += ";Items,";
        for (int i = 0; i < players.get(playerid).getStats().handitems.size(); i++) {
            message += players.get(playerid).getStats().handitems.get(i).getName();
            if (i != players.get(playerid).getStats().handitems.size() - 1) {
                message += ",";
            }
        }
        message += ";ItemsDescriptions,";
        for (int i = 0; i < players.get(playerid).getStats().handitems.size(); i++) {
            message += interpreter(0, players.get(playerid).getStats().handitems.get(i).getHp(),
                    players.get(playerid).getStats().handitems.get(i).getMana(),
                    players.get(playerid).getStats().handitems.get(i).getDefence(),
                    players.get(playerid).getStats().handitems.get(i).getAttack(),
                    players.get(playerid).getStats().handitems.get(i).getSpeed());
            if (i != players.get(playerid).getStats().handitems.size() - 1) {
                message += ",";
            }
        }

        message += ";EnemiesNames,";
        for (int i = 0; i < enemies.size(); i++) {
            message += enemies.get(i).getName();
            if (i != enemies.size() - 1) {
                message += ",";
            }
        }
        message += ";EnemiesHp,";
        for (int i = 0; i < enemies.size(); i++) {
            message += enemies.get(i).getHp();
            if (i != enemies.size() - 1) {
                message += ",";
            }
        }
        message += ";EnemiesMaxHp,";
        for (int i = 0; i < enemies.size(); i++) {
            message += enemies.get(i).getMaxhp();
            if (i != enemies.size() - 1) {
                message += ",";
            }
        }
        message += ";EnemiesImages,";
        for (int i = 0; i < enemies.size(); i++) {
            message += enemies.get(i).getImage();
            if (i != enemies.size() - 1) {
                message += ",";
            }
        }
        message += ";Defence," + players.get(playerid).getStats().getDefence();
        message += ";Attack," + players.get(playerid).getStats().getAttack();
        message += ";Speed," + players.get(playerid).getStats().getSpeed();
        return message;
    }

    public static String parseEnemiesHp(List<Monster> enemies) {
        String message = "";
        message += ";EnemiesHp,";
        for (int i = 0; i < enemies.size(); i++) {
            message += enemies.get(i).getHp();
            if (i != enemies.size() - 1) {
                message += ",";
            }
        }
        return message;
    }

    private static String interpreter(int cost, int hp, int mana, int defence, int attack, int speed) {
        String message = "";
        if (cost != 0) {
            if (cost < 0) {
                message += "+" + (-cost) + " manacost";
            } else {
                message += "-" + cost + " manacost";
            }
        }
        if (hp != 0) {
            if (hp < 0) {
                message += " +" + (-hp) + " hp ";
            } else {
                message += " -" + hp + " hp ";
            }
        }
        if (mana != 0) {
            if (mana < 0) {
                message += " +" + (-mana) + " mana";
            } else {
                message += " -" + mana + " mana";
            }
        }
        if (defence != 0) {
            if (defence > 0) {
                message += " +" + defence + " defence";
            } else {
                message += " -" + (-defence) + " defence";
            }

        }
        if (attack != 0) {
            if (attack > 0) {
                message += " +" + attack + " attack";
            } else {
                message += " -" + (-attack) + " attack";
            }
        }
        if (speed != 0) {
            if (attack > 0) {
                message += " +" + speed + " speed";
            } else {
                message += " -" + (-speed) + " speed";
            }
        }
        return message;
    }
}
